﻿Public Class Abm_libros
    Enum estado
        modificar
        insertar
        consultar
    End Enum

    Dim proximoId As Integer
    Dim datos As AccesoADatos
    Dim carga As ManejoDeCarga
    Dim editar As estado
    Dim id_cliente As Integer

    Private Sub Abm_libros_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        datos = New AccesoADatos()
        carga = New ManejoDeCarga()
        carga.cargarCombo(cmb_editorial, "Editorial", "id_editorial", "nombre")
        carga_grilla("")
        modo(estado.consultar)
        ToolTip1.SetToolTip(Me.btn_nuevo, "Crear un nuevo registro")
        ToolTip1.SetToolTip(Me.btn_modificar, "Modificar el registro seleccionado")
        ToolTip1.SetToolTip(Me.btn_eliminar, "Eliminar el registro seleccionado")
        ToolTip1.SetToolTip(Me.btn_buscar, "Realizar búsqueda")
        ToolTip1.SetToolTip(Me.btn_cancelar, "Cancelar la operación actual")
        ToolTip1.SetToolTip(Me.btn_guardar, "Guardar los datos cargados")
        ToolTip1.SetToolTip(Me.btn_salir, "Salir del formulario")
    End Sub

    Private Sub carga_grilla(ByRef where As String)
        If where = "" Then
            carga.cargarGrilla(dgv_libros, "isbn as ISBN, titulo as Libro, anio as Año, precio as Precio", "Libro")
        Else
            carga.cargarGrilla(dgv_libros, "isbn as ISBN, titulo as Libro, anio as Año, precio as Precio", "Libro", where)
        End If
    End Sub

    Private Sub modo(ByRef e As estado)
        editar = e
        Select Case e
            Case estado.consultar
                Me.btn_buscar.Enabled = True
                Me.txt_isbn.Enabled = False
                Me.txt_titulo.Enabled = False
                Me.txt_idioma.Enabled = False
                Me.txt_precio.Enabled = False
                Me.txt_anio.Enabled = False
                Me.cmb_editorial.Enabled = False
                btn_guardar.Enabled = False
                Me.cmb_editorial.SelectedIndex = -1
                Me.btn_agregarAutor.Enabled = False
                Me.btn_agregarTema.Enabled = False
                Me.btn_quitarTema.Enabled = False
                Me.btn_quitarAutor.Enabled = False
                Me.txt_buscarISBN.Enabled = True
                Me.txt_buscarTitulo.Enabled = True
                Me.dgv_libros.Enabled = True
                pnl_controlesCarga.Enabled = True
                pnl_controlesConfirmacion.Enabled = False
                Exit Select
            Case estado.insertar
                Me.btn_buscar.Enabled = False
                Me.txt_isbn.Enabled = True
                Me.txt_titulo.Enabled = True
                Me.txt_idioma.Enabled = True
                Me.txt_precio.Enabled = True
                Me.cmb_editorial.SelectedIndex = -1
                Me.cmb_editorial.Enabled = True
                Me.btn_agregarAutor.Enabled = True
                Me.btn_agregarTema.Enabled = True
                Me.btn_quitarTema.Enabled = True
                Me.btn_quitarAutor.Enabled = True
                Me.txt_anio.Enabled = True
                btn_guardar.Enabled = True
                Me.txt_buscarISBN.Enabled = False
                Me.txt_buscarTitulo.Enabled = False
                Me.dgv_libros.Enabled = False
                pnl_controlesCarga.Enabled = False
                pnl_controlesConfirmacion.Enabled = True
                Exit Select
            Case estado.modificar
                Me.btn_buscar.Enabled = False
                Me.txt_isbn.Enabled = False
                Me.txt_titulo.Enabled = True
                Me.txt_idioma.Enabled = True
                Me.txt_precio.Enabled = True
                Me.cmb_editorial.Enabled = True
                Me.cmb_editorial.SelectedIndex = -1
                Me.btn_agregarAutor.Enabled = True
                Me.btn_agregarTema.Enabled = True
                Me.btn_quitarTema.Enabled = True
                Me.btn_quitarAutor.Enabled = True
                Me.txt_anio.Enabled = True
                btn_guardar.Enabled = True
                Me.txt_buscarISBN.Enabled = False
                Me.txt_buscarTitulo.Enabled = False
                Me.dgv_libros.Enabled = False
                pnl_controlesCarga.Enabled = False
                pnl_controlesConfirmacion.Enabled = True
                Exit Select
        End Select
    End Sub

    Private Sub btn_nuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_nuevo.Click
        Me.modo(estado.insertar)
        Me.limpiar_campos()
        Me.txt_isbn.Focus()
    End Sub

    Private Sub btn_modificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_modificar.Click
        modo(estado.modificar)

        Dim pk As Double = Me.dgv_libros.CurrentRow.Cells(0).Value
        Dim dt As New Data.DataTable
        Dim tablaAutores As New Data.DataTable
        Dim tablaTemas As New Data.DataTable

        dt = datos.leerTabla("*", "Libro", "isbn = " & pk)

        Me.txt_isbn.Text = dt.Rows(0)("isbn")
        Me.txt_isbnViejo.Text = dt.Rows(0)("isbn")
        Me.txt_titulo.Text = dt.Rows(0)("titulo")
        Me.txt_anio.Text = dt.Rows(0)("anio")
        Me.txt_idioma.Text = dt.Rows(0)("idioma")
        Me.txt_precio.Text = dt.Rows(0)("precio")
        Me.cmb_editorial.SelectedValue = dt.Rows(0)("id_editorial")

        tablaAutores = datos.leerTabla("IdAutor", "LibrosPorAutor", "IdLibro = " & dt.Rows(0)("isbn"))
        tablaTemas = datos.leerTabla("IdTema", "TemasPorLibro", "IdLibro = " & dt.Rows(0)("isbn"))

        For i As Integer = 0 To (tablaAutores.Rows.Count - 1)
            lst_autores.Items.Add(datos.leerTabla("apellido+ ', ' +nombre as Autor", "Autor", "id_autor = " & tablaAutores.Rows(i)("IdAutor")).Rows(0)("Autor"))
        Next

        For j As Integer = 0 To (tablaTemas.Rows.Count - 1)
            lst_temas.Items.Add(datos.leerTabla("Descripcion", "Temas", "IdTema = " & tablaTemas.Rows(j)("IdTema")).Rows(0)("Descripcion"))
        Next
    End Sub

    Private Sub btn_Eliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_eliminar.Click
        If MessageBox.Show("¿Esta seguro que desea borrar el libro seleccionado?", "Importante", _
                                                MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = Windows.Forms.DialogResult.Yes Then
            datos.borrarRegistro("LibrosPorAutor", "IdLibro", Me.dgv_libros.CurrentRow.Cells(0).Value)
            datos.borrarRegistro("TemasPorLibro", "IdLibro", Me.dgv_libros.CurrentRow.Cells(0).Value)
            datos.borrarRegistro("Libro", "isbn", Me.dgv_libros.CurrentRow.Cells(0).Value)
            modo(estado.consultar)
            limpiar_campos()
        End If
    End Sub

    Private Sub limpiar_campos()
        txt_anio.Clear()
        txt_buscarISBN.Clear()
        txt_buscarTitulo.Clear()
        txt_idioma.Clear()
        txt_isbn.Clear()
        txt_precio.Clear()
        txt_titulo.Clear()
        lst_autores.Items.Clear()
        lst_temas.Items.Clear()
        carga_grilla("")
    End Sub

    Private Sub btn_cancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_cancelar.Click
        Dim mensaje As String = "¿Esta seguro que desea cancelar la operación actual?"
        If editar = estado.consultar Then
            mensaje = "¿Cancelar la búsqueda?"
        End If
        If MessageBox.Show(mensaje, "Confirmación", MessageBoxButtons.YesNo, _
                           MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
            modo(estado.consultar)
            limpiar_campos()
        End If
    End Sub

    Private Sub btn_guardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_guardar.Click
        If validar_carga() Then
            If editar = estado.insertar Then
                If insertar_libro() Then

                    Dim nombre As String
                    Dim apellido As String
                    Dim descripcion As String

                    If lst_autores.Items.Count > 0 Then
                        For i As Integer = 0 To (lst_autores.Items.Count - 1) Step +1
                            apellido = lst_autores.Items.Item(i).ToString().Remove(lst_autores.Items.Item(i).ToString().IndexOf(","))
                            nombre = lst_autores.Items.Item(i).ToString().Substring(lst_autores.Items.Item(i).ToString().IndexOf(",") + 2)
                            insertar_libros_por_autor(nombre, apellido, Double.Parse(txt_isbn.Text))
                        Next
                    End If

                    If lst_temas.Items.Count > 0 Then
                        For j As Integer = 0 To (lst_temas.Items.Count - 1)
                            descripcion = Me.lst_temas.Items.Item(j).ToString()
                            insertar_temas_por_libro(descripcion, Double.Parse(txt_isbn.Text))
                        Next
                    End If

                    modo(estado.consultar)

                    limpiar_campos()

                    proximoId += 1

                    MessageBox.Show("Libro agregado correctamente", "Operación exitosa", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            Else
                If modificar_libro() Then

                    Dim nombre As String
                    Dim apellido As String
                    Dim descripcion As String

                    datos.borrarRegistro("LibrosPorAutor", "IdLibro", txt_isbnViejo.Text)
                    datos.borrarRegistro("TemasPorLibro", "IdLibro", txt_isbnViejo.Text)

                    If lst_autores.Items.Count > 0 Then
                        For i As Integer = 0 To (lst_autores.Items.Count - 1) Step +1
                            apellido = lst_autores.Items.Item(i).ToString().Remove(lst_autores.Items.Item(i).ToString().IndexOf(","))
                            nombre = lst_autores.Items.Item(i).ToString().Substring(lst_autores.Items.Item(i).ToString().IndexOf(",") + 2)
                            insertar_libros_por_autor(nombre, apellido, Double.Parse(txt_isbn.Text))
                        Next
                    End If

                    If lst_temas.Items.Count > 0 Then
                        For j As Integer = 0 To (lst_temas.Items.Count - 1)
                            descripcion = Me.lst_temas.Items.Item(j).ToString()
                            insertar_temas_por_libro(descripcion, Double.Parse(txt_isbn.Text))
                        Next
                    End If

                    modo(estado.consultar)

                    limpiar_campos()

                    MessageBox.Show("Libro modificado correctamente", "Operación exitosa", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            End If
        End If
    End Sub

    Private Function validar_carga() As Boolean
        If validar_vacios() Then
            If validar_contenido() Then
                Return True
            End If
        End If
        Return False
    End Function

    Private Function validar_existencia() As Boolean
        If datos.leerTabla("*", "Libro", " isbn = " & txt_isbn.Text).Rows.Count() <> 0 Then
            MessageBox.Show("Ya existe un libro con el isbn ingresado", "Libro no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        Return True
    End Function

    Private Function validar_vacios() As Boolean
        Dim validacion As Boolean = True
        If txt_isbn.Text = "" Or txt_titulo.Text = "" Or cmb_editorial.SelectedIndex = -1 Or txt_anio.Text = "" Or txt_idioma.Text = "" Or txt_precio.Text = "" Then
            MessageBox.Show("Debe completar todos los campos", "Libro no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            validacion = False
        End If
        Return validacion
    End Function

    Private Function validar_contenido() As Boolean
        If IsNumeric(txt_titulo.Text) Then
            MessageBox.Show("El título debe ser texto", "Libro no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        If IsNumeric(txt_idioma.Text) Then
            MessageBox.Show("El idioma debe ser texto", "Libro no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        If (Not (IsNumeric(txt_isbn.Text))) Then
            MessageBox.Show("El isbn debe ser numérico", "Libro no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        If (Not (IsNumeric(txt_anio.Text))) Then
            MessageBox.Show("El año debe ser numérico", "Libro no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        If (Not (IsNumeric(txt_precio.Text))) Then
            MessageBox.Show("El precio debe ser numérico", "Libro no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        Return True
    End Function

    Private Function insertar_libro() As Boolean
        Dim exito As Boolean = True
        If validar_existencia() Then
            Dim valores As String = Me.txt_isbn.Text & ", '" & Me.txt_titulo.Text & "', '" & Me.txt_idioma.Text & "'" _
            & ", " & Me.cmb_editorial.SelectedValue & ", " & Me.txt_anio.Text & ", " & Me.txt_precio.Text
            Try
                datos.insertarRegistro("Libro", valores)
            Catch ex As OleDb.OleDbException
                exito = False
                MessageBox.Show("Error cargando el libro en la base de datos", "Libro no agregado", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        Else
            exito = False
        End If
        Return exito
    End Function

    Private Function modificar_libro() As Boolean
        Dim exito As Boolean = True
        Dim valores As String
        valores = "isbn = " & Me.txt_isbn.Text & ", titulo = '" & Me.txt_titulo.Text & "', idioma = '" & Me.txt_idioma.Text & "'" _
            & ", id_editorial = " & Me.cmb_editorial.SelectedValue & ", anio = " & Me.txt_anio.Text & ", precio = " & Me.txt_precio.Text
        Try
            datos.modificarRegistro("Libro", valores, "isbn", txt_isbnViejo.Text)
        Catch ex As OleDb.OleDbException
            exito = False
            MessageBox.Show("Debe completar los campos correctamente", "Libro no modificado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End Try
        Return exito
    End Function

    Private Sub btn_buscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_buscar.Click
        If validar_campos_de_busqueda() Then

            Dim clausulas As Integer = 0
            Dim where As String = ""

            If txt_buscarISBN.Text <> "" Then
                If validarBuscarIsbn() Then
                    where = "isbn = " & txt_buscarISBN.Text
                    clausulas += 1
                End If
            End If

            If txt_buscarTitulo.Text <> "" Then
                If validarBuscarTitulo() Then
                    If clausulas > 0 Then
                        where &= " and titulo LIKE '%" & txt_buscarTitulo.Text & "%'"
                        clausulas += 1
                    Else
                        where = "titulo LIKE '%" & txt_buscarTitulo.Text & "%'"
                        clausulas += 1
                    End If
                End If
            End If
            Try
                carga_grilla(where)
            Catch ex As OleDb.OleDbException
                MessageBox.Show("Debe completar los campos correctamente", "Error de búsqueda", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                limpiar_campos()
            End Try
        End If
    End Sub
    Private Function validarBuscarIsbn() As Boolean
        If (Not (IsNumeric(txt_buscarISBN.Text))) Then
            MessageBox.Show("El ISBN debe ser numérico", "Búsqueda no realizada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        Return True
    End Function
    Private Function validarBuscarTitulo() As Boolean
        If IsNumeric(txt_buscarTitulo.Text) Then
            MessageBox.Show("El título debe ser texto", "Búsqueda no realizada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        Return True
    End Function
    Private Function validar_campos_de_busqueda() As Boolean
        Dim validacion As Boolean = True
        If txt_buscarISBN.Text = "" And txt_buscarTitulo.Text = "" Then
            MessageBox.Show("Debe completar al menos un campo de búsqueda", "Error en la búsqueda", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            validacion = False
        End If
        Return validacion
    End Function

    Private Sub btn_salir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_salir.Click
        If System.Windows.Forms.DialogResult.OK = MessageBox.Show("Cerrar esta ventana?", "Importante", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) Then
            Me.Close()
        End If
    End Sub

    Private Sub btn_agregarAutor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_agregarAutor.Click
        Dim buscarAutores As New Busqueda_autores()
        buscarAutores.ShowDialog(Me)
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_quitarAutor.Click
        If (Not (lst_autores.SelectedItem Is Nothing)) Then
            lst_autores.Items.Remove(lst_autores.SelectedItem)
        Else
            MessageBox.Show("Debe seleccionar un elemento de la lista.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Sub

    Private Sub btn_agregarTema_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_agregarTema.Click
        Dim agregar_tema As New Busqueda_temas()
        agregar_tema.ShowDialog(Me)
    End Sub

    Private Function insertar_temas_por_libro(ByVal descripcion As String, ByVal isbn As Long) As Boolean
        Dim id_tema As Integer
        id_tema = datos.leerTabla("*", "Temas", "Descripcion = '" & descripcion & "'").Rows(0)("IdTema")
        Try
            datos.insertarRegistro("TemasPorLibro", isbn.ToString() & ", " & id_tema.ToString())
            Return True
        Catch
            Return False
        End Try
    End Function
    Private Function insertar_libros_por_autor(ByVal nombre As String, ByVal apellido As String, ByVal isbn As Long) As Boolean
        Dim id_autor As Integer
        id_autor = datos.leerTabla("*", "Autor", "nombre = '" & nombre & "' and apellido = '" & apellido & "'").Rows(0)("id_autor")
        Try
            datos.insertarRegistro("LibrosPorAutor", id_autor.ToString() & ", " & isbn)
            Return True
        Catch
            Return False
        End Try
    End Function

    Private Sub btn_quitarTema_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_quitarTema.Click
        If (Not (lst_temas.SelectedItem Is Nothing)) Then
            lst_temas.Items.Remove(lst_temas.SelectedItem)
        Else
            MessageBox.Show("Debe seleccionar un elemento de la lista.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Sub
End Class